文件结构
springboot-project
.idea // 编辑器配置文件
.mvn // maven配置文件
src // 源码
main
java
com.example.myproject // 包名
*MySpringBootApplication.java* // 应用的入口类,包含 main 方法,用于启动 Spring Boot 应用
controller // 控制器类,处理用户的输入并返回响应
*MyController.java*
service // 服务类,处理业务逻辑
*MyService.java*
repository // 数据访问类,访问数据库控制数据
*MyRepository.java*
entity // 实体类
*MyEntity.java*
util // 工具类
constant // 常量接口类
config // 配置类,用于配置应用的行为
*MyConfig.java*
exception // 异常处理类,用于捕获异常并处理
*GlobalExceptionHandler.java*
vo // 数据传输类
resources // 包含应用的所有资源文件
static // 存放静态资源,如CSS、JavaScript和图片文件
templates // 存放Web应用的模板文件
*application.properties | application.yml* // 配置文件
test // 按照与src/main/java相似的包结构组织测试类
java
com.example.myproject
*MySpringBootApplicationTests.java*
target // 打包输出目录
*.gitignore* // 定义 Git 版本控制系统应该忽略的文件和目录
*pom.xml* // Maven构建文件,用于定义项目的依赖、插件和其他构建配置
重要文件解析
MyApplication.java
组合注解
@SpringBootApplication
: 这是一个组合注解,它包含了以下三个主要的注解@Configuration
:标记这个类作为应用的配置类,允许在上下文中注册额外的 Bean 或导入其他配置类@EnableAutoConfiguration
:让 Spring Boot 根据类路径中的 jar 包、类,为当前项目进行自动配置@ComponentScan
:告诉 Spring 扫描这个类所在的包及其子包中的注解组件(如 @Component, @Service, @Repository, @Controller 等)
应用启动入口
public static void main(String[] args)
:当运行 Spring Boot 应用时,JVM 调用这个 main 方法启动应用
启动 Spring 应用上下文
SpringApplication.run(MyApplication.class, args)
:初始化并启动整个Spring应用程序
ConfigurableApplicationContext org.springframework.boot.SpringApplication.run(
Class<?> primarySource, // 告诉 SpringApplication 起始的配置类是哪一个
String... args // 从命令行传入的参数
)
功能
-
创建一个合适的 ApplicationContext 实例:当Spring Boot应用启动时,首先会创建一个ApplicationContext实例。这个实例是Spring框架的核心,用于管理应用中所有的bean。创建的实例类型取决于类路径上的配置和其它因素,例如,如果类路径上存在spring-boot-starter-web依赖,那么可能会创建一个AnnotationConfigServletWebServerApplicationContext实例,这是一个用于Web应用的上下文。
-
注册一个 CommandLinePropertySource:这一步是为了将命令行参数添加到Spring的Environment中。CommandLinePropertySource是一个特殊的PropertySource,它允许命令行参数被当作配置属性使用。这意味着你可以在命令行中设置属性值,这些值会被Spring应用读取并使用。
-
刷新 ApplicationContext,加载所有单例 beans:在ApplicationContext创建并配置好之后,会执行刷新操作。这个操作会触发Spring容器的初始化,包括加载所有的单例bean。单例bean是指那些在Spring容器中只被创建一次的bean,它们在第一次被请求时被创建,并在后续的请求中重复使用同一个实例。
-
执行任何 CommandLineRunner beans:在Spring容器刷新并加载所有单例bean之后,如果存在实现了CommandLineRunner接口的bean,它们将被执行。CommandLineRunner是一个函数式接口,它允许你在Spring容器启动并加载所有bean之后执行一些代码。这通常用于执行一些启动时的初始化任务,比如数据的预加载或者发送欢迎消息等。
pom.xml
项目基本信息
<groupId>
:项目的组ID,它是一个标识符,用来区分不同的组织或项目组。在一些项目管理系统中,如Maven或Gradle,这个ID用来组织和管理项目,确保项目的唯一性<artifactId>
:项目ID,它是项目的唯一标识符,用来区分同一个组内的不同项目<version>
:项目版本号,它用来标识项目的不同版本,以便于管理和使用不同版本的项目<name>
:项目的显示名称<description>
:项目描述
父项目
<parent>
:如果该项目依赖于其他项目,那么需要声明该项目是哪个项目的子项目
<!-- Spring Boot父项目,提供依赖管理和插件管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
</parent>
项目依赖
<dependencies>
:声明项目需要用到其他的库或者框架<dependency>
:项目用到的具体依赖
<dependency>
<groupId>com.mysql</groupId> <!-- 组织或项目的唯一标识符 -->
<artifactId>mysql-connector-j</artifactId> <!-- mysql连接java的依赖-->
<version>3.0.3</version> <!-- 依赖的版本 -->
<scope>runtime</scope> <!-- 依赖的作用范围 -->
</dependency>
构建配置
<build>
:设置项目的构建参数,例如源代码目录、目标目录、测试目录等<plugins>
:声明项目需要的插件,例如编译插件、打包插件等<plugin>
:项目用到的具体插件
<plugin>
<groupId>org.springframework.boot</groupId> <!-- 组织或项目的唯一标识符 -->
<artifactId>spring-boot-maven-plugin</artifactId> <!-- Spring Boot的Maven插件,用于打包可执行的jar或war文件 -->
<configuration> <!-- plugin的配置部分 -->
<excludes> <!-- 排除配置容器 -->
<exclude> <!-- 具体排除项 -->
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <!-- 在构建最终的可执行jar包时,不要包含Lombok依赖 -->
</exclude>
</excludes>
</configuration>
</plugin>
application.yml
功能
- 用于配置 Spring Boot 应用程序的文件。它允许开发者为应用程序的不同方面提供特定的配置
语法
- 大小写敏感
- 数值前必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时,不允许使用tab键,只能使用空格
- 缩进的空格数不重要,只要相同层级的元素左侧对齐即可
#
表示注解
基本属性配置
spring:
application:
name: my-application # 设置应用程序的名称
main:
banner-mode: "off" # 关闭启动时的 Banner 显示
encoding: UTF-8 # 设置字符编码
服务器配置(server)
server:
port: 8080 # 设置应用程序的端口号
servlet:
context-path: /myapp # 设置应用程序的上下文路径(例如 http://localhost:8080/myapp)
数据库配置(datasource)
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb # 数据库连接 URL
username: root # 数据库用户名
password: password # 数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver # 数据库驱动类
hikari: # 如果使用 HikariCP 作为连接池
maximum-pool-size: 10 # 最大连接池大小
日志配置
logging:
level:
org.springframework.web: DEBUG # 设置 Spring Web 包的日志级别
com.example.myapp: TRACE # 设置特定包或类的日志级别
file:
name: app.log # 设置日志文件名
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" # 设置控制台输出日志的格式
缓存配置
spring:
cache:
type: redis # 配置使用 Redis 作为缓存提供者
redis:
host: localhost # Redis 服务器的主机
port: 6379 # Redis 服务器的端口
password: mypassword # Redis 连接密码
邮件服务配置
spring:
mail:
host: smtp.example.com # 邮件服务器地址
port: 587 # SMTP 端口
username: user@example.com # 邮箱用户名
password: password # 邮箱密码
protocol: smtp # 使用 SMTP 协议
tls: true # 启用 TLS 加密
Profile配置
- 能够灵活地在不同环境下使用不同配置
- 可以为不同的环境提供不同的
application-{profile}.yml
文件,并将配置项绑定到不同的类 - 在
application.yml
文件中添加spring.profiles.active
属性可以指定默认使用的配置环境
# application-dev.yml 开发环境配置
spring:
profiles: dev
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_password
# application-prod.yml 生产环境配置
spring:
profiles: prod
datasource:
url: jdbc:mysql://localhost:3306/prod_db
username: prod_user
password: prod_password
# application.yml 文件
spring:
profiles:
active: dev # 激活 dev 配置
加载顺序配置
基本原则
- 如果多个位置都存在同名的配置文件,Spring Boot会按照如下优先级使用配置文件,同一配置按照优先级被覆盖
- 外部配置
- 命令行
- 环境变量
java -jar myapp.jar --server.port=9090 --spring.profiles.active=dev #命令行
- 内部配置
- 当前项目下的/config目录
- 当前项目的根目录
- classpath的/config目录
- classpath的根目录
- 默认配置
自定义配置
定义
- 对象:键值对的集合
person:
name: zhangsan
# 行内写法
person: {name: zhangsan}
- 数组:一组按次序排序的值
address:
- beijing
- shanghai
# 行内写法
address: [beijing,shanghai]
- 纯量:不可分割的值
s1: '123 \n 456' # 单引号不会被转义
s2: "123 \n 456" # 双引号会被转义
- 引用:使用定义的参数
name: zhangsan
person:
name: ${name}
访问
- 使用
@Value
访问配置
// 使用@Value
//在Spring容器创建这个Bean的时候,会自动从配置文件中查找名为 `myapp.api.url` 的属性值,并将其注入到 `apiUrl` 这个字段中
@Value("${myapp.api.url}")
private String apiUrl;
- 使用
@ConfigurationProperties
访问配置
<!-- 使用@ConfigurationProperties,需要先配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Data //lombok
@Component //添加到组件
@ConfigurationProperties(prefix = "person")//绑定配置文件中配置类
//prefix属性指定了配置文件中属性的前缀,这样Spring Boot就可以知道应该从配置文件中读取哪些属性来填充这个类的字段
public class Person {
private String name;
private int age;
private String[] address;
}